﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Leetcode_Array.Script.Hash
{
    class HappyNumber
    {
        // ========================== 力扣202 快乐数
        //编写一个算法来判断一个数n是不是快乐数
        //快乐数定义为：对于一个正整数，每一次将该数替换为它的每个位置上的数字的平方和。
        //然后重复这个过程只到这个数变为1，也可能是无限循环，始终变不到1，
        //如果可以变为1，那么这个数就是快乐数。
        //输入：19
        //输出：true
        //解释：
        //1^2 + 9^2 = 82
        //8^2 + 2^2 = 68
        //6^2 + 8^2 = 100
        //1^2 + 0^2 + 0^2 = 1
        public bool IsHappy(int n)
        {
            HashSet<int> set = new HashSet<int>();
            while(true)
            {
                int sum = getSum(n);
                if(sum == 1)
                {
                    return true;
                }
                //如果这个sum曾经出现过，则说明已经无限循环了，立刻return false
                if (set.Contains(sum))
                    return false;
                else
                    set.Add(sum);
                n = sum;
            }
        }
        int getSum(int n)
        {// 取数值各个位上的单数的平方之和
            int sum = 0;
            while (n > 0)
            {
                sum += (n % 10) * (n % 10);
                n /= 10;
            }
            return sum;
        }
    }
}
